//
// Created by sjjmw on 3/24/2022.
//

//应该使用dfs

#include "iostream"
#include "vector"
#include "list"
#include "algorithm"
#include "string"
#include "unordered_map"
#include "cmath"
#include<iomanip>
#include "string"
#include "map"
#include "list"

//最后还是ac了。
//记忆
//加教室，dfs一层一个学生
//1.尝试加入到之前的教室
//2.尝试开新教室
struct Sol{
    int n;
//    std::vector<int> arr;
    std::vector<std::vector<int>> mat;
    bool putable(int x,int y,int v){
        for(int i=0;i<x;i++){
            if(mat[y][i]==v){
                return false;
            }
        }
        for(int i=0;i<y;i++){
            if(mat[i][x]==v){
                return false;
            }
        }
        return true;
    }
    int ans=0;
    void dfs(int index){

        //从第二行第一个开始
        int x=index%n;
        int y=index/n;
        for(int i=1;i<=n;i++){
            if(putable(x,y,i)){
                mat[y][x]=i;
                if(index+1==n*(n-1)){
                    //最终一个
                    ans++;
                    return;
                }else{
                    dfs(index+1);
                }
            }
        }
    }
    void handle(
            int n1
            ){
        n=n1;
        std::vector<int> line(n);
        for (int i = 0; i < n; ++i) {
            mat.push_back(line);
        }
        for (int i = 0; i < n; ++i) {
            mat[0][i]=i+1;
        }
        dfs(n);
        printf("%d",ans);
    }
};
int main(){
    int a,b,c;
//    float a,b,c,d;
    int e;

    while(std::cin>>a){
        Sol().handle(a);

//        Sol().handle(a,b);
    }

    return 0;
}